#include<stdio.h>
#define num 20003
const long max = 1000000000l;
long m,n,k,s,t,d[num][2];
long nHeap,heap[num],h[num][2];
long post[num],isfree[num];
long adj[num][2],adjcost[num][2];
long mang[100001][3];
int test;
int enter=0;
FILE *fp;
/* Moi lan thuc hien chuong trinh */
void input(){
    int i,u,v;
    fscanf(fp,"%ld%ld%ld%ld%ld",&n,&m,&k,&s,&t);
    long int offset=ftell(fp);
    for(i=1;i<=n;i++)h[i][0]=h[i][1]=0;
    for(i=1;i<=m;i++){
        fscanf(fp,"%ld%ld%ld",&mang[i][0],&mang[i][1],&mang[i][2]);
        h[mang[i][0]][0]++;
        h[mang[i][1]][1]++;
    }
    for(i=2;i<=n;i++){
        h[i][0]+=h[i-1][0];
        h[i][1]+=h[i-1][1];
    }
    for(i=1;i<=m;i++){
        u=mang[i][0];
        v=mang[i][1];
        
        adj[h[u][0]][0]=v;
        adjcost[h[u][0]][0]=mang[i][2];
        
        adj[h[v][1]][1]=u;
        adjcost[h[v][1]][1]=mang[i][2];
        
        
        h[u][0]--;
        h[v][1]--;
    }
    h[n+1][0]=h[n+1][1]=m;
}
void update(long v,int id){
    long chid=post[v],parent;
    if(chid==0)chid=++nHeap;
    parent=chid/2;
    while(parent>0 && d[heap[parent]][id]>d[v][id]){
        heap[chid]=heap[parent];
        post[heap[chid]]=chid;
        chid=parent;
        parent=chid/2;
    }
    heap[chid]=v;
    post[v]=chid;
}
long pop(int id){
    long r=1,c,v=heap[nHeap],ret=heap[1];
    nHeap--;
    while(2*r<=nHeap){
        c=2*r;
        if(c<nHeap && d[heap[c+1]][id]<d[heap[c]][id]) c++;
        if(d[v][id]<=d[heap[c]][id])break;
        heap[r]=heap[c];
        post[heap[r]]=r;
        r=c;
    }
    heap[r]=v;
    post[v]=r;
    return ret;
}
void dijkstra(long start,int id){
    long i,u,iv,v,min;
    update(start,id);
    do{
        u=pop(id);
        isfree[u]=1;
        for(iv=h[u][id]+1;iv<=h[u+1][id];iv++){
            v=adj[iv][id];
            if(!isfree[v] && d[v][id]>d[u][id]+adjcost[iv][id]){
                d[v][id]=d[u][id]+adjcost[iv][id];
                update(v,id);
            }
        }
    }while(nHeap>0);
}
long getMin(){
    long i,u,v,l;
    long min=d[t][0];
    for(i=1;i<=k;i++){
        fscanf(fp,"%ld%ld%ld",&u,&v,&l);
        if(min>d[u][0]+d[v][1]+l)min=d[u][0]+d[v][1]+l;
        if(min>d[v][0]+d[u][1]+l)min=d[v][0]+d[u][1]+l;
    }
    if(min==max)return -1;
    else return min;
}
/*void output(){
    int i;
    printf("\n");
    for(i=1;i<=n;i++)printf("%d ",d[i][0]);
    printf("\n");
    for(i=1;i<=n;i++)printf("%d ",d[i][1]);
    printf("\n");
}*/
void process(){
    int i;
    for(i=1;i<=n;i++){
        d[i][0]=max;
        post[i]=isfree[i]=0;
    }
    nHeap=0;
    d[s][0]=0;
    dijkstra(s,0);
    
    for(i=1;i<=n;i++){
        d[i][1]=max;
        isfree[i]=0;
    }
    nHeap=d[t][1]=0;
    dijkstra(t,1);
    if(enter)printf("\n");
    else enter=1;
    printf("%ld",getMin());
}
int main(){
    fp=stdin;
    fscanf(fp,"%d",&test);
    int i;
    for(i=1;i<=test;i++){
        input();
        process();
    }
    return 0;
}
        
